<?php
/**
 * GPCRlog
 *
 * 파라미터(GET, POST, COOKIE, REQUEST) 로그를 생성합니다.
 *
 * @package boot
 * @author  Platform Team
 */

class GPCRlog
{
    /**
     * 로그 생성
     * 로그가 새로 생성이 되거나 존재하는 로그라면 '로그전체경로' 를 반환
     * 로그 생성이 실패하게 되면 false 를 반환
     *
     * !!WARNING!!
     * 반드시 루트 디렉토리는 생성되어 있어야 한다.
     *
     * @param string $sRootDir (루트 디렉토리 : 기본 FW_GPCR_LOG_OUTPUT_DIR)
     * @param int $iDepth   (디렉토리 뎁스 : 기본 FW_GPCR_LOG_OUTPUT_DIR_DEPTH)
     * @return string | false
     */
    public static function create($sRootDir=FW_GPCR_LOG_OUTPUT_DIR, $iDepth=FW_GPCR_LOG_OUTPUT_DIR_DEPTH)
    {
        if (is_dir($sRootDir) === false) {
            throw new Exception('GPCR LOG Root Directory not exist - ' . $sRootDir, E_ERROR);
        }

        $sLogTime = date('Y-m-d H:i:s');

        $aLogKeys = array(
            'get' => array_keys($_GET),
            'post' => array_keys($_POST),
            'request' => array_keys($_REQUEST),
            'cookie'=> array_keys($_COOKIE),
            'url' => $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']
        );

        $aLogBody = array(
            'script_path' => $_SERVER['SCRIPT_FILENAME'],
            'calling_input' => array(
                'get' => $_GET,
                'post' => $_POST,
                'request' => $_REQUEST,
                'cookie' => $_COOKIE
            ),
            'init' => false
        );

        $aLogBody = self::_sort($aLogBody);

        $sConvLogBody = serialize($aLogBody);
        $sConvLogKeys = serialize($aLogKeys);
        $sFileName = md5($sConvLogBody);
        $sFullPath = self::_makeDir($sRootDir, $sFileName, $iDepth);

        $isCreate = true;
        if (file_exists($sFullPath) === false) {
            $sData = $sLogTime . "\n" . $sConvLogBody . "\n" . $sConvLogKeys;
            $result = file_put_contents($sFullPath, $sData);

            if ($result === false) {
                $isCreate = false;
            }
        }

        return ($isCreate === true) ? $sFullPath : false;
    }

    /**
     * 로그 바디 데이터 정렬
     *
     * @param array $aParam
     * @return array
     */
    private static function _sort($aParam)
    {
        ksort($aParam);
        ksort($aParam['calling_input']);
        ksort($aParam['calling_input']['get']);
        ksort($aParam['calling_input']['post']);
        ksort($aParam['calling_input']['request']);
        ksort($aParam['calling_input']['cookie']);

        return $aParam;
    }

    /**
     * 로그 전체경로에 해당되는 디렉토리를 생성하고 전체 경로를 반환
     * (반환되는 값은 파일경로까지 포함입니다.)
     *
     * @param string $sRootDir     (루트 최상위 디렉토리)
     * @param string $sFileName    (순수한 파일명)
     * @param int $iDepth       (디렉토리 뎁스)
     * @return string
     */
    public static function _makeDir($sRootDir, $sFileName, $iDepth)
    {
        $iDepth = (int)$iDepth;
        $sDir = $sRootDir;

        if ($iDepth <= 0) {
            return $sDir . '/' . $sFileName;
        }

        $iDepth = $iDepth > 3 ? 3 : $iDepth;

        for ($i=0; $i < $iDepth; ++$i) {
            $sDir .= '/' . $sFileName[$i];
        }

        if (!is_dir($sDir)) {
            mkdir($sDir, 0777, true);
        }

        return $sDir . '/' . $sFileName;
    }
}